package fdupc.http;

import fdupc.http.function.ResultErrorFunction;
import fdupc.http.function.ResultManagerFunction;
import fdupc.http.function.ResultManagerNotReturnFunction;
import lombok.Data;
import lombok.ToString;
import lombok.experimental.Accessors;
import lombok.experimental.Tolerate;
import lombok.extern.slf4j.Slf4j;

import java.io.Serializable;

/**
 * 类描述: 交互返回对象
 *
 * @author: 王雷
 * @date: 2022/9/17 0017 下午 12:53
 */
@Data
@Slf4j
@ToString
@Accessors(chain = true)
public class ResultBean implements Serializable {

    private static final long serialVersionUID = 3131043284501790520L;
    /**
     * code码（在Code.java中定义）
     */
    private int code;
    /**
     * 消息
     */
    private String msg;
    /**
     * 返回数据用
     */
    private Object data;

    /**
     * 功能描述：数据返回对象工厂——正常
     *
     * @date: 2022/6/5 0005 下午 8:04
     */
    public static ResultBean factorySuccess(Object data) {
        return factorySuccess().setData(data);
    }

    /**
     * 功能描述：数据返回对象工厂——正常
     *
     * @date: 2022/6/5 0005 下午 8:04
     */
    public static ResultBean factorySuccess() {
        return new ResultBean(Code.SUCCESS, Message.SUCCESS);
    }

    /**
     * 功能描述：数据返回对象工厂——异常
     *
     * @date: 2022/6/5 0005 下午 8:04
     */
    public static ResultBean factoryError(String message) {
        final ResultBean resultBean = factoryError();

        if (message != null && !"".equals(message.trim())) {
            return resultBean.setMsg(message);
        }
        return resultBean;
    }

    /**
     * 功能描述：数据返回对象工厂——异常
     *
     * @date: 2022/6/5 0005 下午 8:04
     */
    public static ResultBean factoryError() {
        return new ResultBean(Code.ERROR, Message.ERROR);
    }

    /**
     * 方法名称: 交互返回对象
     *
     * @date: 2023/3/7 20:16
     */
    @Tolerate
    public ResultBean() {
    }

    /**
     * 功能描述：交互返回对象
     * @param code 状态编码
     * @date: 2022/11/30 0030 上午 9:42
     */
    public ResultBean(Code code, String msg) {
        super();
        this.code = code.getCode();
        this.msg = msg;
    }

    /**
     * 属性描述：配置信息
     *
     * @param code code码（在Code.java中定义）
     * @param msg  信息
     * @date: 2022/9/28 0028 下午 3:28
     */
    public void setInfo(Code code, String msg) {
        this.code = code.getCode();
        this.msg = msg;
    }

    /**
     * 属性描述：配置信息
     *
     * @param code code码（在Code.java中定义）
     * @param msg  信息
     * @param data 数据
     * @date: 2022/9/28 0028 下午 3:28
     */
    public void setInfo(Code code, String msg, Object data) {
        this.code = code.getCode();
        this.msg = msg;
        this.data = data;
    }

    /**
     * 功能描述：交互统一返回对象业务构造
     * @date: 2022/11/27 0027 上午 12:26
     */
    public static <R> ResultBean buildToManager(ResultManagerFunction<R> managerFunction
            , ResultErrorFunction errorFunction){
        try {
            return ResultBean.factorySuccess(managerFunction.execute());
        }catch(Exception e){
            log.error("交互处理异常", e);
            final ResultBean resultBean = ResultBean.factoryError();
            errorFunction.execute(resultBean, e);
            return resultBean;
        }
    }

    /**
     * 功能描述：交互统一返回对象业务构造
     * @date: 2022/11/27 0027 上午 12:26
     */
    public static ResultBean buildToManagerNotReturn(ResultManagerNotReturnFunction managerFunction
            , ResultErrorFunction errorFunction){
        try {
            managerFunction.execute();
            return ResultBean.factorySuccess();
        }catch(Exception e){
            log.error("交互处理异常", e);
            final ResultBean resultBean = ResultBean.factoryError();
            errorFunction.execute(resultBean, e);
            return resultBean;
        }
    }
}
